package genetica.mutacion;

import java.util.Random;

import genetica.cromosomas.Cromosoma;
import genetica.cromosomas.CromosomaPG;
import genetica.cromosomas.fenotipos.fenotipoPG.DU;
import genetica.cromosomas.fenotipos.fenotipoPG.EQ;
import genetica.cromosomas.fenotipos.fenotipoPG.MM;
import genetica.cromosomas.fenotipos.fenotipoPG.MP;
import genetica.cromosomas.fenotipos.fenotipoPG.Nodo;
import genetica.cromosomas.fenotipos.fenotipoPG.TreePG;
import genetica.cruce.CrucePG;

public class MutacionFuncionalSimple extends AlgoritmoMutacion{

	public MutacionFuncionalSimple(double pMutacion) {
		super(pMutacion);
	}
	static Random r = new Random();

	@Override
	public void mutacion(Cromosoma original) {
		if (original instanceof CromosomaPG) {
			CromosomaPG cromosoma = (CromosomaPG) original;
			TreePG arbol = cromosoma.getGenotipo().getArbol();
			if (arbol.getProfundidadArbol() >= TreePG.profundidadMaxima)
				CrucePG.adaptarNodo(arbol, TreePG.profundidadMaxima);
			mutaArbol(arbol);
		} else
			throw new Error("Cromosoma invalido");
		
	}
	
	private void mutaArbol(TreePG arbol) {
		Double mutando = r.nextDouble();
		if (!arbol.esHoja()) {
			Nodo nodo = arbol.getNodo();
			if (mutando < pMutacion) {
				if ((nodo instanceof MM) || (nodo instanceof MP))
					arbol.setNodo(CromosomaPG.nodos[(r.nextInt(2)+3)]); // 3 o 4
				
				else if ((nodo instanceof DU) || (nodo instanceof EQ))
					arbol.setNodo(CromosomaPG.nodos[(r.nextInt(2)+6)]); // 6-7 
				// NOT NO PUEDE MUTAR
			}
			for (int i = 0; i < arbol.getHijos().size(); i++) {

			}
		}

	}
	public String toString(){
		return "Algoritmo de mutacion funcional simple";
	}


}
